/**
 * 使用 TCP 套接字
 * client: 创建套接字、申请连接、交互、断开连接
 * server：创建套接字、绑定、监听、获取连接、交互、断开连接
 */
#pragma once
#include <iostream>
#include <string>

#include <sys/types.h>
#include <sys/socket.h>

namespace mySocket
{
    // 抽象类
    class Socket
    {
    public:
        Socket() {}
        virtual ~Socket() = 0;
        // 创建并初始化套接字
        virtual bool InitSocket() = 0;
        // 绑定套接字到内核
        virtual bool Bind() = 0;
        // 监听
        virtual bool Listen() = 0;
        // 获取连接
        virtual bool Accept() = 0;
        // 请求连接
        virtual bool Connect() = 0;
        // 读数据
        virtual bool Read() = 0;
        // 发数据
        virtual bool Write() = 0;
        // 释放套接字资源
        virtual bool Close() = 0;

    private:
    };

    class Client : public Socket
    {
    public:
        // 创建并初始化套接字
        virtual bool InitSocket()
        {
            _fd = socket(AF_INET, SOCK_STREAM, 0);
        }
        // 请求连接
        virtual bool Connect() = 0;
        // 读数据
        virtual bool Read() = 0;
        // 发数据
        virtual bool Write() = 0;
        // 释放套接字资源
        virtual bool Close() = 0;

    private:
        int _fd;
    };

    class Server : public Socket
    {
    public:
        // 创建并初始化套接字
        virtual bool InitSocket() = 0;
        // 绑定套接字到内核
        virtual bool Bind() = 0;
        // 监听
        virtual bool Listen() = 0;
        // 获取连接
        virtual bool Accept() = 0;
        // 读数据
        virtual bool Read() = 0;
        // 发数据
        virtual bool Write() = 0;
        // 释放套接字资源
        virtual bool Close() = 0;

    private:
    };
}
